#pragma once
#include "nnec/nnec_utils.h"

using namespace std;

namespace NNEC {
    typedef struct Struct_Integrand_Parameter {
        double rho;
        double z;
        double k;
        double a;
        void *ptr;
    } Integrand_Parameter;

    complex<double> G(double rho, double z, double z1, double z2);
    complex<double> G1(double rho, double a, double z, double z0);
    complex<double> G2(double rho, double a, double z, double z0);
    complex<double> G3(double rho, double a, double z, double z0);
    complex<double> G4(double rho, double a, double z, double z1, double z2);
    complex<double> G1A(double rho, double a, double z, double z0);
    complex<double> G2A(double rho, double a, double z, double z0);
    complex<double> G3A(double rho, double a, double z, double z0);
    complex<double> G4A(double rho, double a, double z, double z1, double z2);
    complex<double> G1a(double rho, double z, double z0);
    complex<double> G2a(double rho, double z, double z0);
    complex<double> G3a(double rho, double z, double z0);
    complex<double> G4a(double rho, double z, double z1, double z2);
    complex<double> G1B(double rho, double a, double z, double z0);
    complex<double> G2B(double rho, double a, double z, double z0);
    complex<double> G3B(double rho, double a, double z, double z0);
    complex<double> G1b(double rho, double a, double z, double z0);
    complex<double> G2b(double rho, double a, double z, double z0);
    complex<double> G3b(double rho, double a, double z, double z0);
    complex<double> G4b(double rho, double a, double z, double z1, double z2);
}